﻿using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;
using System;
using System.Linq;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeItemTabelaDePreco : ValidadorAbastrato
    {
        private ItemTabelaDePreco _objetoValidado;
        private IRepositorioDeConsultaDeObjetos<ItemTabelaDePreco> _repositorioDeItemTabelaPreco;

        public ValidadorDeItemTabelaDePreco( IRepositorioDeConsultaDeObjetos<ItemTabelaDePreco> repositorioDeItemTabelaPreco )
        {
            if ( repositorioDeItemTabelaPreco == null )
                throw new ArgumentNullException( "repositorioDeItemTabelaPreco" );

            _repositorioDeItemTabelaPreco = repositorioDeItemTabelaPreco;
        }

        public void ValideCadastro( ItemTabelaDePreco itemTabela )
        {
            if ( itemTabela == null )
                throw new ArgumentException( "itemTabelaPreco" );

            _objetoValidado = itemTabela;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideItemTabelaPrecoJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( ItemTabelaDePreco itemTabela )
        {
            if ( itemTabela == null )
            {
                throw new ArgumentException( "tabelaPreco" );
            }

            _objetoValidado = itemTabela;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideItemTabelaPrecoNaoCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao( ItemTabelaDePreco itemTabela )
        {
            if ( itemTabela == null )
            {
                throw new ArgumentException( "itemTabelaPreco" );
            }

            _objetoValidado = itemTabela;
            base.LimpeInconsistencias();
            ValideItemTabelaPrecoNaoCadastrada();
            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if ( _objetoValidado.Codigo == 0 )
                AdicioneInconsistencia( "Código não informado." );
        }

        private bool ItemTabelaPrecoJaCadastrada()
        {
            return _repositorioDeItemTabelaPreco.Consulte( m => m.Codigo == _objetoValidado.Codigo ).Any();
        }

        private void ValideItemTabelaPrecoJaCadastrada()
        {
            if ( ItemTabelaPrecoJaCadastrada() )
                AdicioneInconsistencia( "Já existe Itens de Tabela de Preço cadastrada com o código {0}.", _objetoValidado.Codigo );
        }

        private void ValideItemTabelaPrecoNaoCadastrada()
        {
            if ( !ItemTabelaPrecoJaCadastrada() )
                AdicioneInconsistencia( "Item de Tabela de Preço com o código {0} não cadastrado.", _objetoValidado.Codigo );
        }
    }
}
